[fix](variant) Forward-port Parquet and external Variant fixes to master - #66413
[fix](variant) Forward-port Parquet and external Variant fixes to master#66413Gabriel39 wants to merge 20 commits into
Conversation
|
Thank you for your contribution to Apache Doris. Please clearly describe your PR:
|
|
run buildall |
|
/review |
|
run buildall |
|
/review |
|
Codex automated review failed and did not complete. Error: Codex completed, but no new pull request review was submitted for the current head SHA. Please inspect the workflow logs and rerun the review after the underlying issue is resolved. |
There was a problem hiding this comment.
Request changes: four blocking issues remain.
- Variant footer/page-index pruning can suppress an earlier error-preserving conjunct.
- Late runtime-filter refresh can accept shifted deferred Variant output slots and index outside the active file block.
- Delete-only Variant MERGE is not safe for new-FE/old-BE rolling upgrades.
- One deterministic regression result bypasses the required generated golden file.
Checkpoint conclusions:
- Goal and data correctness: The forward-port covers native Parquet Variant reads, nullable selection, planner/access-path plumbing, metadata COUNT, and delete-only MERGE, with broad unit/regression coverage; the two scan correctness defects above mean the goal is not yet safely achieved.
- Scope and parallel paths: The change is cohesive but large. Footer/page pruning, eager/deferred projection, native/legacy scanner gates, and read/write paths were traced end to end. The mirrored page-index defect is covered by the first inline comment.
- Concurrency and lifecycle: Catalog storage bindings and shredded-state ownership/COW were checked without another defect. Late request activation at row-group boundaries is not safe because deferred positions are not preserved (inline comment).
- Compatibility and protocol: New Thrift plumbing defaults correctly for old-FE/new-BE, but new-FE/old-BE delete-only Variant MERGE lacks a query-wide capability fence (inline comment).
- Tests and observability: The PR reports targeted FE, connector, BE ASAN, and format checks, and adds useful profiles. I did not rerun builds/tests because the authoritative review bundle forbids it. Missing coverage includes unsafe-conjunct metadata pruning, two-root late-RF refresh, mixed-version writer omission, and the signed-selector golden result.
- Transactions/persistence/configuration: No new persistence or dynamic-configuration defect was found; delete-file lifecycle otherwise remains fenced and errors propagate.
User focus: review_focus.txt contains no additional guidance, so the entire PR was reviewed.
Review completion: Three rounds converged on this frozen four-comment set; all other candidates were either disproved by upstream invariants or dismissed with concrete code evidence.
| const std::vector<std::unique_ptr<ParquetColumnSchema>>& file_schema, | ||
| const format::FileScanRequest& request, const cctz::time_zone* timezone) { | ||
| for (const auto& conjunct : request.conjuncts) { | ||
| const auto predicate = extract_variant_shredded_predicate(conjunct); |
There was a problem hiding this comment.
[P1] Fence Variant metadata pruning at the first unsafe conjunct
This loop can skip an earlier non-extractable, error-preserving conjunct and prune from a later Variant comparison before any rows are evaluated. For example, with assert_true(id != 0, 'boom') followed by CAST(v['n'] AS INT) > 3000, a row group containing id = 0 but with shredded n.max <= 3000 is discarded here, so the required error never occurs. TableReader::_is_safe_to_pre_execute() stops split pruning at this barrier, and build_predicate_conjunct_schedule() disables staged compaction for the same reason, but both this footer loop and the page-index loop at 1712 ignore it. Please carry the original safe-prefix boundary into the localized request (slotless barriers may otherwise disappear), apply it to both loops, and add an error-preservation differential test.
| // Signed integer selectors are array indexes, even when a shredded object has a key with the | ||
| // same serialized token. The ambiguous scanner path must retain enough state for both results. | ||
| List<List<Object>> signedSelectorRows = sql """ | ||
| SELECT CAST(v[-1] AS INT), CAST(v['-1'] AS INT) |
There was a problem hiding this comment.
[P2] Record this deterministic result through the golden file
This stable one-row result is currently hardcoded with assertEquals, so it bypasses the suite's generated .out contract. The repository testing rules require determined regression results to use qt/order_qt rather than assertion-style checks. Please make this a named golden query (with deterministic ordering if the fixture can grow) and regenerate test_iceberg_variant_read.out so the signed-selector behavior is reviewed and maintained like the neighboring cases.
| file_request->local_positions = *fixed_local_positions; | ||
| } | ||
| file_request->non_predicate_positions.clear(); | ||
| file_request->conjuncts.clear(); |
There was a problem hiding this comment.
[P1] Preserve deferred output slots across late-filter refresh
refresh_conjuncts() seeds only local_positions, while this clears and later reallocates non_predicate_positions. With two independent Variant roots, the initial layout can be v1 predicate/output at 0/1 and v2 at 2/3; rebuilding from retained locals {0,2} assigns the outputs to 3/4. same_physical_scan_layout() compares only the local map and each root's predicate projection, so it accepts that shifted request even though the active file-block template still has four slots. At the next row group the Parquet scheduler uses the refreshed output positions, overwrites slot 3 and then indexes slot 4 out of range. Please preserve the active deferred-position map and compare both deferred positions and output projection trees before queueing a refresh; add a multi-row-group late-RF test with two deferred roots.
| const auto& merge_sink = _t_sink.iceberg_merge_sink; | ||
| // An old FE cannot produce delete-only plans, so an unset flag retains its data-writer path. | ||
| _writes_data_files = !merge_sink.__isset.writes_data_files || merge_sink.writes_data_files; | ||
| // Missing means an old FE plan, which predates SQL MERGE cardinality validation. |
There was a problem hiding this comment.
[P1] Fence writer omission for old BEs during rolling upgrade
A new FE can now allow a delete-only MERGE on a Variant table and send writes_data_files=false, but an old BE skips this unknown Thrift field and still constructs VIcebergTableWriter. Its init_properties() parses the full Iceberg schema_json, and the old parser has no variant primitive, so a fragment placed on that BE fails while the same fragment succeeds on a new BE. The adjacent cardinality capability is disabled through the query-wide execution version for exactly this rolling-upgrade reason; please add an equivalent capability fence here (or reject this plan in FE until all participating BEs support writer omission) and cover the mixed-version case.
FE UT Coverage ReportIncrement line coverage |
|
PR approved by at least one committer and no changes requested. |
154db63 to
6adba50
Compare
|
run buildall |
|
/review |
There was a problem hiding this comment.
Requesting changes: three additional P1 blockers remain. I deduplicated against the four existing live threads, which continue to cover unsafe Variant metadata-pruning order, late-filter deferred-slot refresh, the regression golden contract, and old-BE merge-writer omission.
Checkpoint conclusions:
- Goal and proof: The PR aims to forward-port native Iceberg Variant reads/writes, physical-leaf pruning, and fused nullable selection. Broad unit and regression coverage is present, but the connector API, rolling-upgrade scan admission, and metadata-COUNT snapshot gaps mean the goal is not safely complete.
- Scope and focus: The change is large but cohesive around external Variant execution.
review_focus.txtadds no extra guidance, so the whole PR was reviewed. - Concurrency: No new thread is introduced. The private shredded-state materialization-cache mutex, its append/reset/read ordering, catalog publication, scanner scheduling, and late runtime-filter activation were traced; no new concurrency issue survived beyond the existing deferred-slot thread.
- Lifecycle: Connector class loading, scan initialization, statement snapshot pinning, file-local projection, block reuse, and merge sink open/close were traced. The metadata-COUNT escape hatch is incorrectly decided before the handle used for planning is pinned (inline).
- Configuration: No new configuration item or dynamic-reload contract is introduced.
- Compatibility: Two public connector SPI methods were added without the required API-major/baseline update (inline). Read-side Variant admission also mistakes a cloud-only smooth-upgrade marker for a general old-BE capability fence (inline).
- Parallel paths: Cloud and community upgrades, root and leaf projections, native and legacy scanner gates, metadata and real-range COUNT, and all merge clause shapes were compared. Delete-only merge propagation is complete for new participants; its old-BE failure remains covered by the existing live thread.
- Conditional logic: The metadata-only COUNT and backend-marker conditions are not sufficient for the states they claim to prove (inline). Other new projection, fallback, and selection gates were checked against their upstream invariants.
- Error handling and memory safety: Status/exception propagation, footer corruption checks, recursive column exclusivity, direct-leaf ownership, nullable alignment, and conversion-failure remapping were checked without another distinct defect.
- Data correctness: Existing live threads cover unsafe metadata pruning and shifted scan coordinates. The new snapshot and mixed-version findings can also route unsupported Variant decoding and are blocking.
- Tests: Coverage is broad, but it lacks connector-major enforcement for the reachable handle/provider surface, a non-cloud old-BE scan case, and a pinned snapshot whose COUNT summary must fall back to files. The existing live P2 covers the deterministic result that bypasses the generated golden file.
- Test results: I did not run builds or tests because the authoritative review bundle requires a static-only review; reported PR results were therefore not independently verified.
- Observability: New scan profiles cover the important reader paths, and no distinct logging or metrics blocker was found. The upgrade and snapshot mismatches need admission-time correctness rather than post-failure observability.
- Transactions and persistence: No Doris EditLog or transaction-state change is introduced. Iceberg snapshot selection and write lifecycle were reviewed; snapshot consistency is the blocking read-side issue.
- Writes and FE-BE variables: The new write flag survives planner clones and new-version sink lifecycles, and its old-FE/new-BE default is conservative. New-FE/old-BE writer omission remains the existing live blocker; the new read carrier has the separate ordinary-upgrade blocker inline.
- Performance and other risks: Physical projection, page/footer pruning, allocation/COW, and fused nullable hot paths were examined. No additional substantiated performance or correctness issue remained after the final candidate audit.
Review status: static review converged on this frozen three-comment addition plus the four existing live threads.
| * Whether this write can emit data files. A delete-only MERGE returns false so a connector may | ||
| * allow position-delete output even when the table has read-only column types. | ||
| */ | ||
| default boolean isWritesDataFiles() { |
There was a problem hiding this comment.
[P1] Bump the connector plugin API for these new SPI methods
This method and ConnectorScanPlanProvider.canServeMetadataOnlyCount() extend the public connector SPI, but the PR leaves the kernel/plugin API at 3.0. A new Iceberg plugin is therefore admitted by an old 3.0 FE; because connector SPI classes are parent-first, planWrite() then invokes isWritesDataFiles() on the old kernel interface and fails with NoSuchMethodError. Please apply the repository's required major bump (including the test pin/baseline), and include these reachable provider/handle types in the frozen surface so this cannot evade the guard.
| ConnectorScanPlanProvider scanProvider = resolveScanProvider(); | ||
| if (isTableLevelCountStarPushdown() && conjuncts.isEmpty() && scanProvider != null) { | ||
| metadataCountProven = onPluginClassLoader(scanProvider, | ||
| () -> scanProvider.canServeMetadataOnlyCount( |
There was a problem hiding this comment.
[P1] Prove metadata COUNT on the same pinned handle that is planned
This capability check runs before pinMvccSnapshot() updates currentHandle, while planScan() later uses the pinned handle and recomputes whether the summary can serve the count. For a time-travel/reference query (or a snapshot change between phases), the early latest snapshot can return true, disabling the old-BE fence, but the selected snapshot can contain deletes or missing counters and fall back to real Variant file ranges. Please apply the statement pin before using this escape hatch, or base the bypass on the actual planned ranges; add a test where latest is countable but the pinned snapshot is not.
| return; | ||
| } | ||
| for (Backend backend : backends) { | ||
| if (backend.isSmoothUpgradeSrc()) { |
There was a problem hiding this comment.
[P1] Fence ordinary rolling-upgrade backends too
isSmoothUpgradeSrc() identifies only the cloud colocated smooth-upgrade source: its production setter is in CloudSystemInfoService, while ordinary backends default this bit to false. During a normal mixed-version cluster upgrade, an old BE therefore passes this loop and can be assigned an Iceberg Variant scan even though it lacks the new carrier/native reader. Please gate on an explicit BE capability or execution version that covers every eligible backend, and test an old non-cloud backend rather than manually setting the cloud-only flag.
BE UT Coverage ReportIncrement line coverage Increment coverage report
|
FE UT Coverage ReportIncrement line coverage |
BE Regression && UT Coverage ReportIncrement line coverage Increment coverage report
|
### What problem does this PR solve? Issue Number: None Related PR: apache#66413 Problem Summary: Review follow-ups found that Variant metadata pruning could bypass an earlier error-producing predicate, late runtime-filter refresh could shift deferred Variant output slots, and mixed-version clusters could schedule unsupported Variant scans or delete-only MERGE plans. The connector SPI version also did not reflect its expanded public surface. In addition, debug Boolean validation filtered and copied large nullable complex columns even when they contained no Boolean values, which could exhaust query memory. This change preserves the safe pruning prefix and scan layout, introduces execution-version compatibility gates, bumps and freezes the connector SPI surface, pins metadata-count checks to the selected snapshot, and skips allocation-heavy Boolean filtering when no Boolean subcolumn exists. ### Release note Iceberg Variant scans and delete-only MERGE now enforce rolling-upgrade compatibility, and debug column validation avoids copying non-Boolean complex payloads. ### Check List (For Author) - Test: Unit Test and Regression Test - Focused ASAN BE unit tests for Boolean validation, Variant scan refresh, metadata pruning, page filtering, and MERGE compatibility - FE compatibility and connector SPI surface unit tests - Generated Iceberg Variant regression golden output - FE Checkstyle and BE clang-format - Behavior changed: Yes. Unsafe metadata pruning and mixed-version Variant execution are rejected or conservatively evaluated, and non-Boolean nullable complex columns are validated without copying their payload. - Does this need documentation: No
|
run buildall |
### What problem does this PR solve? Issue Number: None Related PR: apache#66446 Problem Summary: Remove the forward port of projected shredded Variant state preservation and its master-only callback adaptation so the branch returns exactly to the state before that pull request. ### Release note None ### Check List (For Author) - Test: No need to test (the resulting tree exactly matches the pre-apache#66446 state) - Behavior changed: Yes (removes the apache#66446 forward port) - Does this need documentation: No
### What problem does this PR solve? Issue Number: None Related PR: apache#66412 Problem Summary: Forward-port compound Parquet Page Index pruning to master. AND nodes intersect conservative candidate ranges, OR nodes union them, and unavailable OR branches retain the complete range. The master adaptation also keeps compound predicates behind the existing metadata-pruning safety fence. ### Release note Support compound Parquet Page Index pruning in File Scanner V2. ### Check List (For Author) - Test: Unit Test (2 focused BE ASAN tests passed) - Behavior changed: Yes (enables conservative compound Page Index pruning) - Does this need documentation: Yes (included in this commit)
### What problem does this PR solve? Issue Number: None Related PR: apache#66413 Problem Summary: The forward-ported Iceberg case expected the branch-4.1 nested-path rendering, while plugin-driven scans on master render projected paths by logical column name. The Paimon DESC golden also omitted the Extra column that master returns for every schema row. Align both expectations with the observed master output without weakening the execution checks. ### Release note None ### Check List (For Author) - Test: Regression framework unit tests (3 tests passed) and static validation of the six-column DESC golden shape. - Behavior changed: No - Does this need documentation: No
TPC-H: Total hot run time: 29326 ms |
1e8e8c6 to
a1de39a
Compare
|
run buildall |
|
/review |
TPC-DS: Total hot run time: 166373 ms |
|
Codex automated review failed and did not complete. Error: All Codex review accounts are usage-limited; earliest retry is 2026-08-08T03:32:00Z. Please trigger /review again after that time. |
TPC-H: Total hot run time: 29018 ms |
TPC-DS: Total hot run time: 166512 ms |
ClickBench: Total hot run time: 23.85 s |
BE UT Coverage ReportIncrement line coverage Increment coverage report
|
BE Regression && UT Coverage ReportIncrement line coverage Increment coverage report
|
FE Regression Coverage ReportIncrement line coverage |
…pache#66529) ## Proposed changes - make Iceberg compatibility gates conservative and bounded while pinning column handles to historical schemas - reset connector metadata across INSERT retries and align V1/V2 defaults, required-field checks, and position-delete row projection - support primitive partition sources nested in structs, including nullable-parent propagation and regression coverage - cache the compact equality-delete field-ID projection by immutable table snapshot even when the optional full manifest cache is disabled - resolve nested partition sources through the top-level Nereids slot ID and fail closed when stable Iceberg IDs are unavailable ## Compatibility-gate trade-offs - Equality-delete fencing remains conservative across all delete manifests in the selected snapshot, including partition-pruned scans. The snapshot-scoped field-ID cache removes repeated manifest walks without weakening correctness; initial-load failures still fail closed and remain retryable. - Requiredness fencing intentionally uses bounded schema-history inspection rather than an O(snapshot-count) ancestry walk because snapshot schema IDs are optional. Once a projected requiredness hazard exists, every non-empty selected snapshot is fenced. This can reduce rolling-upgrade availability but cannot create a correctness false negative. ## Testing - `mvn -pl fe-core,fe-connector/fe-connector-iceberg -am -Dtest=PhysicalExternalRowLevelMergeSinkTest,IcebergManifestCacheTest,IcebergScanPlanProviderTest -Dsurefire.failIfNoSpecifiedTests=false test` - `mvn -pl fe-connector/fe-connector-iceberg -am -Dtest=IcebergScanPlanProviderTest,IcebergConnectorMetadataTest,IcebergWritePlanProviderTest -Dsurefire.failIfNoSpecifiedTests=false test` - `mvn -pl fe-core -am -Dtest=ConnectorStatementScopeTest,InsertIntoTableCommandTest -Dsurefire.failIfNoSpecifiedTests=false test` - `./run-be-ut.sh --run --filter=SchemaTest.*:VIcebergTableWriterTest.*:IcebergReaderTest.v1_materializes_non_finite_initial_defaults:IcebergV2ReaderTest.PreparesIcebergNonFiniteInitialDefaults:IcebergPositionDeleteSysTableV2ProfileTest.*` - FE Checkstyle for all affected modules - clang-format 16 check for all changed C/C++ files
…#66470) ## Summary - backport the floating-point pruning correctness fixes to branch-4.1 for File Scanner V2 - preserve Doris NaN and signed-zero equality semantics in V2 Parquet Bloom, min/max, and IN-predicate pruning - keep pruning conservative when Parquet statistics omit NaNs or a Bloom encoding cannot safely prove absence - leave the legacy File Scanner V1 path unchanged ## Testing - clang-format 16 check on all affected C/C++ files - compiled every affected production and test translation unit after rebasing onto branch-4.1 - 121 focused BE unit tests passed, including expression, hybrid-set, and native V2 Parquet pruning coverage
…che#66471) ## Summary - backport nested Parquet Bloom-filter pruning support to branch-4.1 - resolve struct and list leaf predicates for equality, null-safe equality, and IN probes - retain table-level evaluation when schema mapping, nullability, or expression localization makes early filtering unsafe - preserve filter order and merge deferred complex projections so rejected localization cannot bypass validation or drop residual-filter children - keep nested Variant leaf predicates eager while validating nullability only at mapped table-schema levels - add pruning diagnostics and focused coverage for Parquet, ORC, column mapping, and TableReader paths ## Testing - clang-format 16 check on all affected C/C++ files - 162 focused BE unit tests across ExprZonemapFilterTest, ColumnMapperScanRequestTest, ParquetBloomFilterPruningTest, and TableReaderTest - 38 focused mapper tests, including ColumnMapperTest.NestedVariantAllAccessPathKeepsPhysicalTypedLeaf from BE UT build 1016464
|
run buildall |
|
/review |
|
Codex automated review failed and did not complete. Error: All Codex review accounts are usage-limited; earliest retry is 2026-08-08T03:32:00Z. Please trigger /review again after that time. |
Summary
Forward-port the Parquet nullable selection optimization from branch-4.1 to the latest master.
Forward-port Iceberg Variant reads to master's plugin-driven connector implementation.
Preserve File Scanner V2 safety checks, mixed-version backend gating, typed-leaf projection, and delete-only MERGE behavior.
Resolve the latest-master benchmark and deferred-column layout conflicts while retaining coverage from both sides.
Adapt the catalog Hadoop-property concurrency fix to master's storage adapter architecture by atomically publishing an immutable shared snapshot.
Expand Iceberg Variant reader coverage for primitive types, nested containers, multi-file scans, row groups, delete vectors, equality/position deletes, and lazy materialization.
Preserve append atomicity for nullable, STRUCT, ARRAY, and MAP destinations when lazy Variant fallback discovers corrupt input.
Cache Variant schema presence so ordinary Parquet scans avoid Variant-specific planning and statistics work.
Forward-port compound Parquet Page Index pruning, combining AND ranges by intersection and OR ranges by union while preserving residual evaluation.
Keep compound predicate pruning behind master's metadata-pruning safety fence.
Forward-port the hardened projected shredded Variant lifecycle fixes, preserving projected state across exchange, TopN, truncation, mixed file layouts, and scanner-profile destruction.
Add native Paimon reads for schema-matched unannotated Variant carriers without misclassifying ordinary structs.
Apply the external-table guardrail stabilization by removing nondeterministic scanner-distribution assertions while retaining deterministic parallel correctness coverage.
Fix late runtime-filter refreshes so predicate/non-predicate reclassification is accepted only when physical slots and projections remain unchanged.
Preserve Paimon nested timestamp semantics with Parquet's independent predicate and deferred-output projections after rebasing.
Map Paimon Variant schemas to the execution-only VariantV2 carrier so both JNI and native scan plans remain queryable in Nereids.
Align the Iceberg nested-path EXPLAIN assertion and Paimon six-column DESC golden with master's plugin-driven metadata format.
Forward-port Iceberg schema-evolution and nested partition-write hardening, including nested defaults and rollback-safe append behavior.
Preserve Doris floating-point equality semantics for Parquet pruning across NaN values and signed zero.
Safely localize nested Parquet Bloom probes while preserving predicate order, schema-validation barriers, and conservative fallback.
Original pull requests
[opt](parquet) Fuse fragmented nullable selection planning #66397
[feature](variant) Support reading Iceberg Variant from Parquet #66302
[fix](catalog) safely publish Hadoop properties #66392
[fix](variant) Preserve nested Variant append atomicity #66421
[fix](parquet) Isolate Variant planning from ordinary scans #66441
[improvement](parquet) Support compound Page Index pruning in File Scanner V2 #66412
branch-4.1: [fix](paimon) Support Variant in native reader #66503
[fix](regression) Stabilize external table guardrail cases #66509
[fix](iceberg) Harden schema evolution and nested partition writes #66529
[fix](be) Preserve floating-point equality in Parquet pruning #66470
[fix](be) Safely prune nested Parquet columns with Bloom filters #66471
Verification
FE reactor build, Checkstyle, and targeted tests: 277 tests passed for the Parquet and Iceberg forward ports.
CatalogPropertyTest: 2 tests passed for atomic publication and snapshot immutability.Final FE Checkstyle passed for all 74 reactor modules after rebasing onto master at
a82564ced5.Final post-rebase FE reactor compilation and targeted tests passed: 104 tests across
ConnectorPluginSurfaceTest,IcebergWritePlanProviderTest,RequestPropertyDeriverTest, andPluginDrivenTableSinkTest.Repository clang-format 16 verification passed for all 85 affected C/C++ source and header files.
BE ASAN targeted tests: 408 tests from 29 suites passed for the earlier forward ports.
Focused BE ASAN compound Page Index tests: 2 tests from 2 suites passed.
Final focused BE ASAN verification after rebasing: 225 tests from 18 suites passed, including late runtime-filter refresh, nested timestamp semantics, Variant, Parquet, and Paimon coverage.
Clang-format 16 dry run passed for all 85 C/C++ source and header files changed by this PR.
PaimonTypeMappingReadTest: 3 tests passed with Maven build cache disabled.ConnectorColumnConverterTest#testComputeVariantCarrierConversion: 1 test passed with Maven build cache disabled.Full FE Checkstyle passed for all 74 reactor modules after the Paimon Variant mapping fix.
Regression framework build and tests passed: 3 tests, 0 failures; the Paimon DESC golden was also validated as six columns with an empty Extra field.
git diff --checkpassed for the Groovy source changes; the generated Paimon.outrows retain the required trailing delimiter for an empty Extra field.Full FE Checkstyle passed for all 74 reactor modules after applying [fix](iceberg) Harden schema evolution and nested partition writes #66529.
Targeted FE Iceberg planner, metadata, manifest-cache, and statement-scope tests passed after applying [fix](iceberg) Harden schema evolution and nested partition writes #66529.
BE ASAN floating-point pruning verification passed: 58 tests from 6 suites after applying [fix](be) Preserve floating-point equality in Parquet pruning #66470.
Final BE ASAN nested-pruning verification passed: 356 tests from 6 suites after applying [fix](be) Safely prune nested Parquet columns with Bloom filters #66471 and the master API adaptations.
Clang-format 16 verification passed for all 47 C/C++ source and header files changed by [fix](iceberg) Harden schema evolution and nested partition writes #66529, [fix](be) Preserve floating-point equality in Parquet pruning #66470, and [fix](be) Safely prune nested Parquet columns with Bloom filters #66471.